/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package analisador.lexico;

import java.io.IOException;

/**
 *
 * @author Will
 */
public class Token {
    
    
    private String nome, tipo;
    private String erro;
    private AnalisadorLexico analisLex;
    private boolean encontrouErro = false;
    private int linhaAtual= 0, linhaAnt = 0;
    Token(AnalisadorLexico value){
        this.analisLex = value;
    }
    
    
    public void getToken() throws ExcecaoCompilador{
        nome = "";
        tipo = "";
        
        analisLex.setMainBuffer("");
        
        //Espacos
        if (analisLex.espacos()){
            if(analisLex.lendoLinha)
                 getToken();
            //getLinha();
            return;
            //return encontrouErro;
        }

        //Comentario
        //System.out.println("Token Comentario");
        if(analisLex.comentario()){
            erro = analisLex.getErro();
            encontrouErro = analisLex.isEncontrouErro();
            if(encontrouErro)
                tipo = "@@##%%$$";
            else if(analisLex.lendoLinha)
                getToken();
            //return encontrouErro;
            //getLinha();
            return;
        }

        //Cadeia literal
        if(analisLex.cadeiaLiteral()){
            erro = analisLex.getErro();
            encontrouErro = analisLex.isEncontrouErro();
                if(!encontrouErro){
                    nome = analisLex.getMainBuffer();
                    tipo = "cadeia_literal";
                    //System.out.println(nome + " - " + tipo);
                }else
                    tipo = "@@##%%$$";
                //return encontrouErro;
                getLinha();
                return;
        }

        //Numero inteiro e numero real
        if(analisLex.numeroIntReal()){
                if(analisLex.isIsFloat()){
                    nome = analisLex.getMainBuffer();
                    tipo = "numero_real";
                    //System.out.println(analisLex.getMainBuffer() + " - numero_real");      
                }else{
                    nome = analisLex.getMainBuffer();
                    tipo = "numero_inteiro";                 
                    //System.out.println(analisLex.getMainBuffer() + " - numero_inteiro");    
                }
                //System.out.println(nome + " - " + tipo);
                if(encontrouErro)
                    tipo = "@@##%%$$";
                //return encontrouErro;
                getLinha();
                return;
        }

        //Identificador e palavra reservada
        if(analisLex.identificadorPalavraReservada()){
            if(analisLex.isReservada()){
                nome = analisLex.getMainBuffer();
                tipo = analisLex.getMainBuffer();
                //System.out.println(analisLex.getMainBuffer() + " - " + analisLex.getMainBuffer());
            }else{
                nome = analisLex.getMainBuffer();
                tipo = "identificador";
                //System.out.println(analisLex.getMainBuffer() + " - identificador");
            }
            //System.out.println(nome + " - " + tipo);
            if(encontrouErro)
                tipo = "@@##%%$$";
            //return encontrouErro;
            getLinha();
            return;
        }

            //Simbolos simples e compostos
        if(analisLex.simbolos()){
            nome = analisLex.getMainBuffer();
            tipo = analisLex.getMainBuffer();
            //System.out.println(analisLex.getMainBuffer() + " - " + analisLex.getMainBuffer());
            //System.out.println(nome + " - " + tipo);
            if(encontrouErro)
                    tipo = "@@##%%$$";
            //return encontrouErro;
            getLinha();
            return;
        }

        //encontrouErro = true;
        tipo = "@@##%%$$";
        analisLex.erro();
        //return encontrouErro;
            
        
            
    }

    private boolean lerAFrente() {
        return analisLex.lerAFrente();
    }

    private boolean retornarLeitura() {
        return analisLex.retornarLeitura();
    }

    private Object getPalavra(String valor) {
        return analisLex.getPalavra(valor);
    }

    private Object getSimbolo(String valor) {
        return analisLex.getSimbolo(valor);
    }

    public boolean isEncontrouErro() {
        return encontrouErro;
    }

    public String getErro() {
        return erro;
    }

    public String getNome() {
        return nome;
    }

    public String getTipo() {
        return tipo;
    }

    @Override
    public String toString() {
        return tipo;
    }

    public boolean equals(String obj) {
        return tipo.equals(obj);
    }
    
    public int getLinha(){
        if(linhaAtual != 0)
            linhaAnt = linhaAtual;
        if(analisLex.getLeitura()){
            linhaAtual = analisLex.getCountLinha();
            return analisLex.getCountLinha();
        }
        linhaAtual = analisLex.getCountLinha() - 1;
        return analisLex.getCountLinha() - 1;
    }

    public int getLinhaAnt() {
        return linhaAnt;
    }
    
    
    
/*    public void setOut(String valor) throws IOException{
        analisLex.setOut(valor);
    }*/

    void setOut(String frase) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
    
}
